package main

import (
	"fmt"
	"time"
)

type Person1 struct {
	Name string
	Age int
	Gender string
}

func (person Person1) test() {
	fmt.Println(person.Name)
}

// 通常为了提高效率，避免结构体值拷贝传递，使用结构体指针
func (person *Person1) test1()  {
	p := &Person1{"小明", 20, "男"}
	fmt.Println((*p).Name)
	fmt.Println(p.Name)
}

// 方法作用在指定的数据类型上，因此自定义数据类型也可以有方法
// 方法访问控制范围同函数一样，首字母大写才可以在本包及其他包使用
// 如果一个类型实现了String()方法，那么fmt.Prinln()默认调用这个变量的String()进行输出
//func (p *P) String() string {
//
//}

func main() {
	p := &Person1{Name: "小花"}
	//t1 := time.Now().UnixNano()  // 转为时间戳
	p.test()
	time.Sleep(2)
	//t2 := time.Now().UnixNano()
	// 如果是time.Now()，那么是t2.Sub(t1)
	//fmt.Println("值拷贝", t2-t1 )

	//t3 := time.Now().UnixNano()  // 转为时间戳
	p.test1()
	//(&p).test1()
	//time.Sleep(2)
	//t4 := time.Now().UnixNano()
	//fmt.Println("值拷贝", t4-t3 )
	fmt.Println()
}
